﻿using Spider.Analyse;
using Spider.BuildUrl.天气预报URlBuild;
using Spider.DB;
using Spider.Entitys.Enums;
using Spider.Entitys.天气预报各级实体对象;
using Spider.Get;
using Spider.HTMLAnalyse.天气预报各级HTML解析;
using Spider.Rules;
using Spider.Rules.天气预报URL规则;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Spider.Init
{
    public class Init天气预报 : Iinit
    {
        /// <summary>
        /// HTML页面解析XPath
        /// </summary>
        IRule rule { get; set; }

        /// <summary>
        /// 页面解析规则
        /// </summary>
        IAnalyse analyse { get; set; }

        /// <summary>
        /// 数据库持久化方式
        /// </summary>
        IDBs db { get; set; }

        #region 设置数据库持久化方式
        /// <summary>
        /// 设置数据库持久化方式
        /// </summary>
        /// <param name="db"></param>
        public void SetDB(IDBs db)
        {
            this.db = db;
        }
        #endregion

        /// <summary>
        /// 爬虫启动方法
        /// </summary>
        public void Start()
        {
            if (db == null)
            {
                throw new Exception("请指定数据库持久化方式");
            }

            //页面初始化URL
            string url = "http://" + "www.tianqihoubao.com/lishi/";
            ///  这个网站的编码是 GB2312
            string html = GetHTML.Get(url);
            weather entity = null;
            #region 页面抓取内容分析
            ///页面分析 获取天气历史数据
            ///url中的是第一级
            ///全部的省
            ///     获取到省下面全部的市
            ///     获取到所有的区
            ///     获取到区里面所有的月份
            ///           每天的数据
            ///           当天的详细数据 
            #endregion

            //只要有一个必要的元素为null 给他默认的规则
            #region 初始化页面解析规则
            if (rule == null || analyse == null)
            {
                analyse = new 天气预报省解析();
                rule = new 天气预报省XPath();
            }
            #endregion

            ///抓取页面然后把页面给解析规则处理
            List<天气预报省> 省List = analyse.AnalyseStart<天气预报省>(html, rule);
            foreach (var sheng in 省List)
            {
                //拼接 市级URL
                url = 天气预报URLBuild.CreateUrl(sheng.URL, 天气预报.省);
                html = GetHTML.Get(url);
                analyse = new 天气预报市解析();
                rule = new 天气预报市XPath();
                List<天气预报市> 市List = analyse.AnalyseStart<天气预报市>(html, rule);
                foreach (var shi in 市List)
                {
                    url = 天气预报URLBuild.CreateUrl(shi.URL, 天气预报.市);
                    html = GetHTML.Get(url);
                    analyse = new 天气预报月份解析();
                    rule = new 天气预报月XPath();
                    List<天气预报月> 月List = analyse.AnalyseStart<天气预报月>(html, rule);
                    foreach (var yue in 月List)
                    {
                        url = 天气预报URLBuild.CreateUrl(yue.Url, 天气预报.月);
                        html = GetHTML.Get(url);
                        analyse = new 天气预报每天解析();
                        rule = new 天气预报天XPath();
                        List<天气预报天> 天List = analyse.AnalyseStart<天气预报天>(html, rule);
                        foreach (var tian in 天List)
                        {
                            url = 天气预报URLBuild.CreateUrl(tian.URL, 天气预报.日);
                            html = GetHTML.Get(url);
                            analyse = new 天气预报每天详情解析();
                            rule = new 天气预报天详情XPath();
                            List<每天详细的天气情况> 详情 = analyse.AnalyseStart<每天详细的天气情况>(html, rule);
                            entity = new weather
                            {
                                province = sheng,
                                city = shi,
                                month = yue,
                                day = tian,
                                details = 详情.FirstOrDefault()
                            };
                            db.Save<weather>(entity);
                        }
                    }
                }
            }
        }
    }
}
